#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;

const int N = 1e6 + 10, INF = 0x3f3f3f3f;

int n, k, idx = 1;
struct node
{
    int ne[26], pass, eds;
}t[N];

void insert(string& s) {
    int p = 1;
    t[p].pass++;
    for (int i = 0;i < s.length();i++) {
        int c = s[i] - 'a';
        if (t[p].ne[c] == 0) t[p].ne[c] = ++idx;
        p = t[p].ne[c];
        t[p].pass++;
    }
    t[p].eds++;
}

void init()
{
    for (int i = 1;i <= idx;i++) {
        memset(t[i].ne, 0, sizeof t[i].ne);
        t[i].pass = t[i].eds = 0;
    }
    idx = 1;
}

/*
对于选择k个字符串的情况中，
求其中两两字符串的公共前缀所构成的集合的所有公共前缀是其他情况下最小，
在这个集合中字典序最大的公共前缀串
就是最小求最大
*/

void solve()
{
    init();
    cin >> n >> k;
    for (int i = 1;i <= n;i++) {
        string s; cin >> s;
        insert(s);
    }

    int p = 1;
    while (1) {
        int tmp = t[p].eds;
        for (int i = 0;i < 26;i++) if (t[p].ne[i]) tmp++;
        //对于当前前缀可以用tmp个字符串构造出来，对于每一个分支只统计一次，是为了防止某些分支会构造出比这个前缀字典序更大的公共前缀
        //如果说tmp>=k，就可以在tmp中随便选择k个串构造出这样一个公共前缀，直接退出循环就是答案
        if (tmp >= k) {
            //在起点就可以选择k个串构造出空串
            if (p == 1)  cout << "EMPTY";
            cout << '\n';
            return;
        }

        for (int i = 0;i < 26;i++) {
            if (t[p].ne[i] == 0) continue;
            //从小到大枚举，依次加上分支上串的个数，-1是因为上层循环中统计过一次
            tmp += t[t[p].ne[i]].pass - 1;
            if (tmp >= k) {
                //tmp - t[t[p].ne[i]].pass是能够构造出这个公共前缀的字符串和上面统计只能构造比这个前缀字典序更小的其他被统计的字符串的贡献，要减去
                //代表能够构成这个最大前缀串确定下来了，在往下构造只需要在当前公共前缀的基础上在搜索。
                k -= tmp - t[t[p].ne[i]].pass;
                cout << (char)(i + 'a');
                p = t[p].ne[i];
                break;
            }
        }
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
#define ONLINE_JUDGE
#ifndef ONLINE_JUDGE
    std::istringstream in(R"()");
    std::cin.rdbuf(in.rdbuf());
#endif
    int T = 1;
    cin >> T;
    for (int i = 1;i <= T;i++) {
        solve();
    }
}